home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / tex-k / web2c.tex--xet.help (.txt) < prev    next >
LaTeX Document  |  1994-11-24  |  27KB

  1. From: ;SPMquot;Zvi Har'El;SPMquot; ;SPMlt;rl@leeor.technion.ac.il;SPMgt;
  2. Subject: Re: TeX--XeT and/or working TIE for C
  3.  
  4. <P>
  5. I have a web2c-6.1 version of tex--xet files tex.ch and tex.web.
  6. I generated them using the web2c-5.851d files from noa.huji.ac.il,
  7. taking into account the changes in web2c from 5.851d to 6.1.
  8. I enclose here unified diffs (genrated by gnu diff -U 1),
  9. so you can generate the files using patch.
  10. If you want the files themselves, let me know and I'll put them in our
  11. public ftp directory so you can fetch them.
  12.  
  13. <P>
  14. Zvi.
  15. ================================================================================
  16. --- tex.ch.orig    Mon Jul 25 16:31:38 1994
  17. +++ tex.ch    Mon Jul 25 16:34:00 1994
  18. @@ -610,3 +610,3 @@
  19.  @x
  20. -wterm(banner);
  21. +wterm(TeX_XeT_banner);
  22.  if format_ident=0 then wterm_ln(' (no format preloaded)')
  23. @@ -1095,3 +1095,3 @@
  24.  @x
  25. -begin wlog(banner);
  26. +begin wlog(TeX_XeT_banner);
  27.  slow_print(format_ident); print(;SPMquot;  ;SPMquot;);
  28. @@ -1981,10 +1981,5 @@
  29.  @x
  30. -This section should be replaced, if necessary, by any special
  31. +The following sections, as recommended, contain the more extensive
  32.  modifications of the program
  33.  that are necessary to make T<SMALL>E</SMALL>X work at a particular installation.
  34. -It is usually best to design your change file so that all changes to
  35. -previous sections preserve the section numbering; then everybody's version
  36. -will be consistent with the published program. More extensive changes,
  37. -which introduce new sections, can be inserted here; then only the index
  38. -itself will get a new section number.
  39.  @^system dependencies@;SPMgt;
  40. --- tex.web.orig    Mon Jul 25 16:31:39 1994
  41. +++ tex.web    Mon Jul 25 18:28:20 1994
  42. @@ -44,2 +44,3 @@
  43.  <tex2html_comment_mark>1
  44. +<tex2html_comment_mark>2
  45.  
  46. <P>
  47. @@ -60,2 +61,20 @@
  48.  =<tex2html_comment_mark>3
  49. ++<tex2html_comment_mark>5
  50. +<tex2html_comment_mark>6
  51. +<tex2html_comment_mark>7
  52. +<tex2html_comment_mark>8
  53. +<tex2html_comment_mark>9
  54. +<tex2html_comment_mark>10
  55. +<tex2html_comment_mark>11
  56. +<tex2html_comment_mark>12
  57. +<tex2html_comment_mark>13
  58. +<tex2html_comment_mark>14
  59. +  
  60. +        <tex2html_comment_mark>15
  61. +      <tex2html_comment_mark>16
  62. +<tex2html_comment_mark>17
  63. +        <tex2html_comment_mark>18
  64. +      <tex2html_comment_mark>19
  65. +
  66.  
  67. @@ -124,2 +143,5 @@
  68.  
  69. <P>
  70. +@d TeX_XeT_version=='--1.0' <#7#>identifies the current TeX--XeT version<#7#>
  71. +@d TeX_XeT_copyright=='TeX--XeT Copyright (C) 1992 by Dante e.V.'
  72. +
  73.  @ The present implementation has a long ancestry, beginning in the summer
  74. @@ -177,5 +199,28 @@
  75.  
  76. <P>
  77. -If this program is changed, the resulting system should not be called
  78. -`T<SMALL>E</SMALL>X'; the official name `T<SMALL>E</SMALL>X' by itself is reserved
  79. -for software systems that are fully compatible with each other.
  80. +
  81. +This program contains code for mixed left-to-right and right-to-left
  82. +typesetting. This code is inspired by but different from T<SMALL>E</SMALL>X-<#106#><SMALL>E</SMALL>X<#106#> as
  83. +presented by Donald~E. Knuth and Pierre MacKay in <#8#><I>TUGboat</I><#8#>
  84. +@^Knuth, Donald Ervin@;SPMgt;
  85. +@^MacKay, Pierre@;SPMgt;
  86. +<#9#><B>8</B><#9#>, 14--25, 1987. Since the original program is changed, the
  87. +resulting system is not called `T<SMALL>E</SMALL>X'; the official name `T<SMALL>E</SMALL>X' by
  88. +itself is reserved for software systems that are fully compatible with
  89. +each other.
  90. +
  91. +In order to avoid confusion with T<SMALL>E</SMALL>X-<#107#><SMALL>E</SMALL>X<#107#> the present implementation of
  92. +mixed direction typesetting is called T<SMALL>E</SMALL>X-<#108#><SMALL>E</SMALL>X-<#108#>. It differs from T<SMALL>E</SMALL>X-<#109#><SMALL>E</SMALL>X<#109#> +in several important aspects:
  93. +(1)~Right-to-left text is reversed explicitely by the |ship_out| routine
  94. +and is written to a normal ḊVI file without any |begin_reflect| or
  95. +|end_reflect| commands; (2)~a |math_node| is (ab)used instead of a
  96. +|whatsit_node| to record the Ḃ
  97. <R>beginL, Ḃ
  98. <R>endL, Ḃ
  99. <R>beginR, and
  100. +Ḃ
  101. <R>endR text direction primitives in order not to influence the line
  102. +breaking algorithm for pure left-to-right text; (3)~therefore T<SMALL>E</SMALL>X-<#110#><SMALL>E</SMALL>X-<#110#> +is designed to be used instead of and not in addition to T<SMALL>E</SMALL>X and
  103. +consequently the pool file name is not changed; (4)~right-to-left text
  104. +interrupted by a displayed equation is automatically resumed after that
  105. +equation; and (5)~the |valign| command code with a non-zero command
  106. +modifier is (ab)used for the text direction primitives.
  107. +
  108.  A special test suite called the ``ṪRIP test'' is available for
  109. @@ -183,3 +228,3 @@
  110.  known as `T<SMALL>E</SMALL>X' [cf.~Stanford Computer Science report CS1027,
  111. -November 1984].
  112. +November 1984]. As a consequence of points~(1) and~(2) above T<SMALL>E</SMALL>X-<#111#><SMALL>E</SMALL>X-<#111#> 
  113. <P>
  114. @@ -218,2 +263,7 @@
  115.  
  116. <P>
  117. +@d TeX_XeT_banner=='This is TeX--XeT',
  118. +   ', Version 3.141' <#16#>here we should use a substring of banner<#16#>
  119. +   ,TeX_XeT_version <#17#>printed when T<SMALL>E</SMALL>X starts<#17#>
  120. +
  121. +
  122.  @ The program begins with a normal Pascal program heading, whose
  123. @@ -1554,3 +1604,3 @@
  124.  @;SPMlt;Initialize the output...@;SPMgt;=
  125. -wterm(banner);
  126. +wterm(TeX_XeT_banner);
  127.  if format_ident=0 then wterm_ln(' (no format preloaded)')
  128. @@ -1558,2 +1608,3 @@
  129.    end;
  130. +wterm_ln(TeX_XeT_copyright); <#18#>may be omitted under certain circumstances<#18#>
  131.  update_terminal;
  132. @@ -3069,2 +3120,6 @@
  133.  
  134. <P>
  135. +In addition a |math_node| with |subtype;SPMgt;after| and |width=0| will be
  136. +(ab)used to record one of the text direction primitives ( Ḃ
  137. <R>beginL,
  138. +Ḃ
  139. <R>endL, Ḃ
  140. <R>beginR, Ḃ
  141. <R>endR ).
  142. +
  143.  @d math_node=9 <#23#>|type| of a math node<#23#>
  144. @@ -3072,2 +3127,13 @@
  145.  @d after=1 <#24#>|subtype| for math node that winds up a formula<#24#>
  146. +@#
  147. +@d L_code=2
  148. +@d begin_L_code=L_code+before <#91#>|subtype| for Ḃ
  149. <R>beginL `math node'<#91#>
  150. +@d end_L_code=L_code+after <#92#>|subtype| for Ḃ
  151. <R>endL `math node'<#92#>
  152. +@d R_code=4
  153. +@d begin_R_code=R_code+before <#93#>|subtype| for Ḃ
  154. <R>beginR `math node'<#93#>
  155. +@d end_R_code=R_code+after <#94#>|subtype| for Ḃ
  156. <R>endR `math node'<#94#>
  157. +@#
  158. +@d end_LR(#)==odd(subtype(#))
  159. +@d end_LR_type(#)==(subtype(#)+after-before)
  160. +@d begin_LR_type(#)==(info(#)-after+before)
  161.  
  162. <P>
  163. @@ -3544,3 +3610,4 @@
  164.  glue_node: if glue_ptr(p);SPMlt;;SPMgt;zero_glue then print_char(;SPMquot; ;SPMquot;);
  165. -math_node: print_char(;SPMquot;<tex2html_verbatim_mark>#math20#;SPMquot;); + <I>math</I><SUB>n</SUB><I>ode</I> : <I>ifsubtype</I>(<I>p</I>) ;SPMgt; <I>afterthenprint</I>(;SPMquot;[];SPMquot;) + <I>elseprint</I><SUB>c</SUB><I>har</I>(;SPMquot;;SPMquot;);
  166.  ligature_node: short_display(lig_ptr(p));
  167. @@ -3809,3 +3876,9 @@
  168.  @ @;SPMlt;Display math node |p|@;SPMgt;=
  169. -begin print_esc(;SPMquot;math;SPMquot;);
  170. +if subtype(p);SPMgt;after then
  171. +  begin if odd(subtype(p)) then print_esc(;SPMquot;end;SPMquot;)
  172. +  else print_esc(;SPMquot;begin;SPMquot;);
  173. +  if subtype(p);SPMlt;=end_L_code then print_char(;SPMquot;L;SPMquot;)
  174. +  else print_char(;SPMquot;R;SPMquot;);
  175. +  end
  176. +else begin print_esc(;SPMquot;math;SPMquot;);
  177.  if subtype(p)=before then print(;SPMquot;on;SPMquot;)
  178. @@ -4089,3 +4162,4 @@
  179.  @d halign=32 <#95#>horizontal table alignment ( Ḃ
  180. <R>halign )<#95#>
  181. -@d valign=33 <#96#>vertical table alignment ( Ḃ
  182. <R>valign )<#96#>
  183. +@d valign=33 <#97#>vertical table alignment ( Ḃ
  184. <R>valign ) or text
  185. +    direction ( Ḃ
  186. <R>beginL, Ḃ
  187. <R>endL, Ḃ
  188. <R>beginR, Ḃ
  189. <R>endR )<#97#>
  190.  @d no_align=34 <#98#>temporary escape from alignment ( Ḃ
  191. <R>noalign )<#98#>
  192. @@ -4290,2 +4364,4 @@
  193.  In horizontal mode, the |prev_graf| field is used for initial language data.
  194. +A nineth quantity, |LR_save|, holds the LR stack when a paragraph is
  195. +interrupted by a displayed formula.
  196.  
  197. <P>
  198. @@ -4305,2 +4381,3 @@
  199.    @!aux_field: memory_word;
  200. +  @!LRs_field: halfword;
  201.    end;
  202. @@ -4317,2 +4394,3 @@
  203.  @d mode_line==cur_list.ml_field <#37#>source file line number at beginning of list<#37#>
  204. +@d LR_save==cur_list.LRs_field <#38#>LR stack when a paragraph is interrupted<#38#>
  205.  
  206. <P>
  207. @@ -4342,2 +4420,3 @@
  208.  prev_depth:=ignore_depth; mode_line:=0;
  209. +LR_save:=null;
  210.  prev_graf:=0; shown_mode:=0;
  211. @@ -4357,2 +4436,3 @@
  212.  incr(nest_ptr); head:=get_avail; tail:=head; prev_graf:=0; mode_line:=line;
  213. +LR_save:=null;
  214.  end;
  215. @@ -5712,2 +5792,10 @@
  216.  @!@:valign_<#105#><#99#>Ḃ
  217. <R>valign primitive@;SPMgt;
  218. +primitive(;SPMquot;beginL;SPMquot;,valign,begin_L_code);@/
  219. +@!@:beginL_<#99#><#100#>Ḃ
  220. <R>beginL primitive@;SPMgt;
  221. +primitive(;SPMquot;endL;SPMquot;,valign,end_L_code);@/
  222. +@!@:endL_<#100#><#101#>Ḃ
  223. <R>endL primitive@;SPMgt;
  224. +primitive(;SPMquot;beginR;SPMquot;,valign,begin_R_code);@/
  225. +@!@:beginR_<#101#><#102#>Ḃ
  226. <R>beginR primitive@;SPMgt;
  227. +primitive(;SPMquot;endR;SPMquot;,valign,end_R_code);@/
  228. +@!@:endR_<#102#><#103#>Ḃ
  229. <R>endR primitive@;SPMgt;
  230.  primitive(;SPMquot;vcenter;SPMquot;,vcenter,0);@/
  231. @@ -5764,3 +5852,9 @@
  232.  vadjust: print_esc(;SPMquot;vadjust;SPMquot;);
  233. -valign: print_esc(;SPMquot;valign;SPMquot;);
  234. +valign: if chr_code;SPMlt;;SPMgt;0 then case chr_code of
  235. +  begin_L_code: print_esc(;SPMquot;beginL;SPMquot;);
  236. +  end_L_code: print_esc(;SPMquot;endL;SPMquot;);
  237. +  begin_R_code: print_esc(;SPMquot;beginR;SPMquot;);
  238. +  othercases print_esc(;SPMquot;endR;SPMquot;)
  239. +  endcases
  240. +else print_esc(;SPMquot;valign;SPMquot;);
  241.  vcenter: print_esc(;SPMquot;vcenter;SPMquot;);
  242. @@ -10322,3 +10416,3 @@
  243.  @ @;SPMlt;Print the banner...@;SPMgt;=
  244. -begin wlog(banner);
  245. +begin wlog(TeX_XeT_banner);
  246.  slow_print(format_ident); print(;SPMquot;  ;SPMquot;);
  247. @@ -12238,3 +12332,25 @@
  248.  
  249. <P>
  250. -@d synch_h==if cur_h;SPMlt;;SPMgt;dvi_h then
  251. +For mixed direction text (T<SMALL>E</SMALL>X-<#112#><SMALL>E</SMALL>X-<#112#>) the current text direction is called
  252. +|cur_dir|. As the box being shipped out will never be used again and
  253. +soon be recycled, we can simply reverse any R-text (i.e., right-to-left)
  254. +segments of hlist nodes as well as complete hlist nodes embedded in such
  255. +segments. Moreover this can be done iteratively rather than recursively.
  256. +There are, however, two complications related to leaders which require
  257. +some additional bookkeeping: (1)~One and the same hlist node might be
  258. +used more than once (but never inside both L- and R-text); and
  259. +(2)~leader boxes inside hlists must be aligned with respect to the left
  260. +edge of the original hlist.
  261. +
  262. +A math node is changed into a kern node whenever the text direction
  263. +remains the same, it is replaced by an |edge_node| if the text direction
  264. +changes; an |hlist_node| inside R-text is changed to an |R_node| once
  265. +its hlist has been reversed.
  266. +@!@^data structure assumptions@;SPMgt;
  267. +
  268. +    @d R_node=unset_node <#44#>an |unset_node| does not occur during |ship_out|<#44#>
  269. +    @d left_to_right=0
  270. +    @d right_to_left=1
  271. +    @d reflected==1-cur_dir <#45#>the opposite of |cur_dir|<#45#>
  272. +    @#
  273. +    @d synch_h==if cur_h;SPMlt;;SPMgt;dvi_h then
  274.      begin movement(cur_h-dvi_h,right1); dvi_h:=cur_h;
  275. @@ -12250,2 +12366,4 @@
  276.  @!cur_s:integer; <#46#>current depth of output box nesting, initially -1<#46#>
  277. +@!cur_dir:small_number; <#47#>current text direction<#47#>
  278. +@!LR_ptr:pointer; <#48#>stack of LR codes<#48#>
  279.  
  280. <P>
  281. @@ -12306,3 +12424,4 @@
  282.  @!outer_doing_leaders:boolean; <#49#>were we doing leaders?<#49#>
  283. -@!edge:scaled; <#50#>left edge of sub-box, or right edge of leader space<#50#>
  284. +@!edge:scaled; <#51#>right edge of sub-box or leader space<#51#>
  285. +@!prev_p:pointer; <#52#>one step behind |p|<#52#>
  286.  begin this_box:=temp_ptr; g_order:=glue_order(this_box);
  287. @@ -12313,2 +12432,5 @@
  288.  save_loc:=dvi_offset+dvi_ptr; base_line:=cur_v; left_edge:=cur_h;
  289. +prev_p:=this_box+list_offset;
  290. +if cur_dir=right_to_left then if type(this_box)=hlist_node then
  291. +  @;SPMlt;Reverse the complete hlist and change this node into an |R_node|@;SPMgt;;
  292.  while p;SPMlt;;SPMgt;null do @;SPMlt;Output node |p| for |hlist_out| and move to the next node,
  293. @@ -12334,3 +12456,3 @@
  294.    cur_h:=cur_h+char_width(f)(char_info(f)(c));
  295. -  p:=link(p);
  296. +  prev_p:=p; p:=link(p);
  297.    until not is_char_node(p);
  298. @@ -12353,3 +12475,3 @@
  299.  begin case type(p) of
  300. -hlist_node,vlist_node:@;SPMlt;Output a box in an hlist@;SPMgt;;
  301. +hlist_node,vlist_node,R_node:@;SPMlt;Output a box in an hlist@;SPMgt;;
  302.  rule_node: begin rule_ht:=height(p); rule_dp:=depth(p); rule_wd:=width(p);
  303. @@ -12359,4 +12481,10 @@
  304.  glue_node: @;SPMlt;Move right or output leaders@;SPMgt;;
  305. -kern_node,math_node:cur_h:=cur_h+width(p);
  306. +kern_node:cur_h:=cur_h+width(p);
  307. +math_node:
  308. +  begin @;SPMlt;Adjust the LR stack for the |ship_out| routine; if necessary
  309. +    reverse an hlist segment and |goto reswitch||@;SPMgt;;
  310. +  cur_h:=cur_h+width(p);
  311. +  end;
  312.  ligature_node: @;SPMlt;Make node |p| look like a |char_node| and |goto reswitch|@;SPMgt;;
  313. +@;SPMlt;Cases of |hlist_out| that arise in mixed direction text only@;SPMgt;@;
  314.  othercases do_nothing
  315. @@ -12366,3 +12494,3 @@
  316.  move_past: cur_h:=cur_h+rule_wd;
  317. -next_p:p:=link(p);
  318. +next_p:prev_p:=p; p:=link(p);
  319.  end
  320. @@ -12373,6 +12501,7 @@
  321.    cur_v:=base_line+shift_amount(p); <#53#>shift the box down<#53#>
  322. -  temp_ptr:=p; edge:=cur_h;
  323. +  temp_ptr:=p; edge:=cur_h+width(p);
  324. +  if cur_dir=right_to_left then cur_h:=edge;
  325.    if type(p)=vlist_node then vlist_out@+else hlist_out;
  326.    dvi_h:=save_h; dvi_v:=save_v;
  327. -  cur_h:=edge+width(p); cur_v:=base_line;
  328. +  cur_h:=edge; cur_v:=base_line;
  329.    end
  330. @@ -12416,2 +12545,3 @@
  331.    begin rule_wd:=rule_wd+10; <#54#>compensate for floating-point rounding<#54#>
  332. +  if cur_dir=right_to_left then cur_h:=cur_h-10;
  333.    edge:=cur_h+rule_wd; lx:=0;
  334. @@ -12422,3 +12552,5 @@
  335.        then advance |cur_h| by |leader_wd+lx|@;SPMgt;;
  336. -  cur_h:=edge-10; goto next_p;
  337. +    if cur_dir=right_to_left then cur_h:=edge
  338. +    else cur_h:=edge-10;
  339. +    goto next_p;
  340.    end;
  341. @@ -12462,2 +12594,3 @@
  342.  synch_h; save_h:=dvi_h; temp_ptr:=leader_box;
  343. +if cur_dir=right_to_left then cur_h:=cur_h+leader_wd;
  344.  outer_doing_leaders:=doing_leaders; doing_leaders:=true;
  345. @@ -12509,3 +12642,3 @@
  346.  begin case type(p) of
  347. -hlist_node,vlist_node:@;SPMlt;Output a box in a vlist@;SPMgt;;
  348. +hlist_node,vlist_node,R_node:@;SPMlt;Output a box in a vlist@;SPMgt;;
  349.  rule_node: begin rule_ht:=height(p); rule_dp:=depth(p); rule_wd:=width(p);
  350. @@ -12531,3 +12664,4 @@
  351.    save_h:=dvi_h; save_v:=dvi_v;
  352. -  cur_h:=left_edge+shift_amount(p); <#55#>shift the box right<#55#>
  353. +  if cur_dir=right_to_left then cur_h:=left_edge-shift_amount(p)
  354. +  else cur_h:=left_edge+shift_amount(p); <#56#>shift the box right<#56#>
  355.    temp_ptr:=p;
  356. @@ -12543,3 +12677,6 @@
  357.  if (rule_ht;SPMgt;0)and(rule_wd;SPMgt;0) then <#57#>we don't output empty rules<#57#>
  358. -  begin synch_h; synch_v;
  359. +  begin if cur_dir=right_to_left then cur_h:=cur_h-rule_wd;
  360. +  synch_h; synch_v;
  361. +  dvi_out(put_rule); dvi_four(rule_ht); dvi_four(rule_wd);
  362. +  cur_h:=left_edge;
  363.    dvi_out(put_rule); dvi_four(rule_ht); dvi_four(rule_wd);
  364. @@ -12640,3 +12777,7 @@
  365.    end;
  366. +cur_dir:=left_to_right; <#58#>L-text at the outer level<#58#>
  367. +LR_ptr:=get_avail; info(LR_ptr):=before; <#59#>this will never match<#59#>
  368.  @;SPMlt;Ship box |p| out@;SPMgt;;
  369. +if info(LR_ptr);SPMlt;;SPMgt;before then LR_confusion;
  370. +free_avail(LR_ptr); LR_ptr:=null;
  371.  if tracing_output;SPMlt;=0 then print_char(;SPMquot;];SPMquot;);
  372. @@ -12846,3 +12987,7 @@
  373.  
  374. <P>
  375. -@p function hpack(@!p:pointer;@!w:scaled;@!m:small_number):pointer;
  376. +@p function safe_info(@!p:pointer): halfword;
  377. +begin if p=null then safe_info:=0@+else safe_info:=info(p);
  378. +end;
  379. +@#
  380. +function hpack(@!p:pointer;@!w:scaled;@!m:small_number):pointer;
  381.  label reswitch, common_ending, exit;
  382. @@ -12857,3 +13002,6 @@
  383.  @!hd:eight_bits; <#60#>height and depth indices for a character<#60#>
  384. -begin last_badness:=0; r:=get_node(box_node_size); type(r):=hlist_node;
  385. +@!LR_ptr:pointer; <#61#>stack of LR codes<#61#>
  386. +@!LR_problems:integer; <#62#>counts missing begins and ends<#62#>
  387. +begin LR_ptr:=null; LR_problems:=0;
  388. +last_badness:=0; r:=get_node(box_node_size); type(r):=hlist_node;
  389.  subtype(r):=min_quarterword; shift_amount(r):=0;
  390. @@ -12870,3 +13018,4 @@
  391.        for an overfull or underfull hbox@;SPMgt;;
  392. -exit: hpack:=r;
  393. +exit: @;SPMlt;Check for LR anomalies at the end of |hpack|@;SPMgt;;
  394. +hpack:=r;
  395.  end;
  396. @@ -12894,3 +13043,6 @@
  397.    glue_node:@;SPMlt;Incorporate glue into the horizontal totals@;SPMgt;;
  398. -  kern_node,math_node: x:=x+width(p);
  399. +  kern_node,math_node:
  400. +    begin x:=x+width(p);
  401. +    @;SPMlt;Adjust the LR stack for the |hpack| routine@;SPMgt;;
  402. +    end;
  403.    ligature_node: @;SPMlt;Make node |p| look like a |char_node|
  404. @@ -17014,3 +17166,3 @@
  405.  disc_node: @;SPMlt;Try to break after a discretionary fragment, then |goto done5|@;SPMgt;;
  406. -math_node: begin auto_breaking:=(subtype(cur_p)=after); kern_break;
  407. +  math_node: begin auto_breaking:=(subtype(cur_p);SPMlt;;SPMgt;before); kern_break;
  408.    end;
  409. @@ -17200,3 +17352,5 @@
  410.  @!cur_line: halfword; <#63#>the current line number being justified<#63#>
  411. -begin @;SPMlt;Reverse the links of the relevant passive nodes, setting |cur_p| to the
  412. +  @!LR_ptr:pointer; <#64#>stack of LR codes<#64#>
  413. +  begin LR_ptr:=LR_save;
  414. +  @;SPMlt;Reverse the links of the relevant passive nodes, setting |cur_p| to the
  415.    first breakpoint@;SPMgt;;
  416. @@ -17213,3 +17367,3 @@
  417.  @:this can't happen line breaking<#103#><#104#>;SPMnbsp;;SPMnbsp;;SPMnbsp;;SPMnbsp;line breaking@;SPMgt;
  418. -prev_graf:=best_line-1;
  419. +prev_graf:=best_line-1; LR_save:=LR_ptr;
  420.  end;
  421. @@ -17243,3 +17397,4 @@
  422.    if type(q)=kern_node then if subtype(q);SPMlt;;SPMgt;explicit then goto done1;
  423. -  r:=q; <#65#>now |type(q)=glue_node|, |kern_node|, |math_node| or |penalty_node|<#65#>
  424. +    r:=q; <#66#>now |type(q)=glue_node|, |kern_node|, |math_node| or |penalty_node|<#66#>
  425. +    @;SPMlt;Adjust the LR stack for the |post_line_break| routine@;SPMgt;;
  426.    end;
  427. @@ -17260,4 +17415,7 @@
  428.  @;SPMlt;Justify the line ending at breakpoint |cur_p|, and append it...@;SPMgt;=
  429. +@;SPMlt;Insert LR nodes at the beginning of the current line and adjust
  430. +  the LR stack based on LR nodes in this line@;SPMgt;;
  431.  @;SPMlt;Modify the end of the line to reflect the nature of the break and to include
  432.    Ḃ
  433. <R>rightskip; also set the proper value of |disc_break|@;SPMgt;;
  434. +@;SPMlt;Insert LR nodes at the end of the current line@;SPMgt;;
  435.  @;SPMlt;Put the <tex2html_verbatim_mark>#math21#<I>l</I> )˙
  436. <BR><I>leftskipglueattheleftanddetachthisline</I>@ ;SPMgt; ;@@ - 17283, 3 + 17441, 5@@| <I>disc</I><SUB>b</SUB><I>reak</I> : = <I>true</I>|@ ;SPMgt; - <I>elseif</I> (<I>type</I>(<I>q</I>) = <I>math</I><SUB>n</SUB><I>ode</I>)<I>or</I>(<I>type</I>(<I>q</I>) = <I>kern</I><SUB>n</SUB><I>ode</I>)<I>thenwidth</I>(<I>q</I>) : = 0; + <I>elseif</I> (<I>type</I>(<I>q</I>) = <I>math</I><SUB>n</SUB><I>ode</I>)<I>or</I>(<I>type</I>(<I>q</I>) = <I>kern</I><SUB>n</SUB><I>ode</I>)<I>then</I> + <I>beginwidth</I>(<I>q</I>) : = 0;@ ;SPMlt; <I>AdjusttheLRstackforthe</I>| <I>p</I>...@ ;SPMgt; ; + <I>end</I>;<I>end</I>@@ - 21104, 2 + 21264, 5@@<I>elseline</I><SUB>b</SUB><I>reak</I>(<I>widow</I><SUB>p</SUB><I>enalty</I>); + <I>ifLR</I><SUB>s</SUB><I>ave</I> ;SPMlt; ;SPMgt; <I>nullthen</I> + <I>beginflush</I><SUB>l</SUB><I>ist</I>(<I>LR</I><SUB>s</SUB><I>ave</I>);<I>LR</I><SUB>s</SUB><I>ave</I> : = <I>null</I>; + <I>end</I>;<I>normal</I><SUB>p</SUB><I>aragraph</I>;@@ - 21546, 3 + 21709, 5@@@ ;SPMlt; <I>Casesof</I>| <I>main</I><SUB>c</SUB><I>ontrol</I>| <I>thatbuild</I>...@ ;SPMgt; = - <I>vmode</I> + <I>halign</I>, <I>hmode</I> + <I>valign</I> : <I>init</I><SUB>a</SUB><I>lign</I>; + <I>vmode</I> + <I>halign</I>, <I>hmode</I> + <I>valign</I> : + <I>ifcur</I><SUB>c</SUB><I>hr</I> ;SPMgt; 0<I>thentail</I><SUB>a</SUB><I>ppend</I> (<I>new</I><SUB>m</SUB><I>ath</I>(0, <I>cur</I><SUB>c</SUB><I>hr</I>)) + <I>elseinit</I><SUB>a</SUB><I>lign</I>;<I>mmode</I> + <I>halign</I> : <I>ifprivilegedthen</I>@@ - 24882, 11 + 25047, 258@@@*<P><tex2html_verbatim_mark>#math22#</P><DIV ALIGN="CENTER">
  437. </DIV><P></P>54]<I>System</I> - <I>dependentchanges</I>. - <I>Thissectionshouldbereplaced</I>, <I>ifnecessary</I>, <I>byanyspecial</I> + <I>Thefollowingsections</I>, <I>asrecommended</I>, <I>containthemoreextensivemodificationsoftheprogramthatarenecessarytomakeT</I><SMALL><I>E</I></SMALL><I>X</I> <I>workataparticularinstallation</I>. - <I>Itisusuallybesttodesignyourchangefilesothatallchangesto</I> - <I>previoussectionspreservethesectionnumbering</I>;<I>theneverybody'sversion</I> - <I>willbeconsistentwiththepublishedprogram</I>.<I>Moreextensivechanges</I>, - <I>whichintroducenewsections</I>, <I>canbeinsertedhere</I>;<I>thenonlytheindex</I> - <I>itselfwillgetanewsectionnumber</I>.@<SUP>s</SUP><I>ystemdependencies</I>@ ;SPMgt; + + @<I>Insertsystemdependentchangeshere</I>. + + @<I>Lastnotleastwedothemainworkrequiredformixed</I> - <I>directiontexts</I>. + <I>Anumberofroutinesarebasedonastackofone</I> - <I>wordnodeswhose</I>| <I>info</I>| + <I>fieldscontain</I>| <I>after</I>|,| <I>end</I><SUB>L</SUB><SUB>c</SUB><I>ode</I>|, <I>or</I>| <I>end</I><SUB>R</SUB><SUB>c</SUB><I>ode</I>|.<I>Thetopofthe</I> + <I>stackispointedtoby</I>| <I>LR</I><SUB>p</SUB><I>tr</I>|. + + <I>Whenthestack</I><SUB>m</SUB><I>anipulationmacrosofthissectionareusedbelow</I>, + <I>variable</I>| <I>LR</I><SUB>p</SUB><I>tr</I>| <I>mightbetheglobalvariabledeclaredfor</I>| <I>ship</I><SUB>o</SUB><I>ut</I>|, + <I>ormightbelocalto</I>| <I>hpack</I>| <I>or</I>| <I>post</I><SUB>l</SUB><I>ine</I><SUB>b</SUB><I>reak</I>|. + + @<I>dpush</I><SUB>L</SUB><I>R</I>(#) = = <I>begintemp</I><SUB>p</SUB><I>tr</I> : = <I>get</I><SUB>a</SUB><I>vail</I>;<I>info</I>(<I>temp</I><SUB>p</SUB><I>tr</I>) : = <I>end</I><SUB>L</SUB><I>R</I><SUB>t</SUB><I>ype</I>(#); + <I>link</I>(<I>temp</I><SUB>p</SUB><I>tr</I>) : = <I>LR</I><SUB>p</SUB><I>tr</I>;<I>LR</I><SUB>p</SUB><I>tr</I> : = <I>temp</I><SUB>p</SUB><I>tr</I>; + <I>end</I> + @<I>dpop</I><SUB>L</SUB><I>R</I> = = <I>begintemp</I><SUB>p</SUB><I>tr</I> : = <I>LR</I><SUB>p</SUB><I>tr</I>;<I>LR</I><SUB>p</SUB><I>tr</I> : = <I>link</I>(<I>temp</I><SUB>p</SUB><I>tr</I>); + <I>free</I><SUB>a</SUB><I>vail</I> (<I>temp</I><SUB>p</SUB><I>tr</I>); + <I>end</I> + + @ ;SPMlt; <I>InsertLRnodesatthebeg</I>...@ ;SPMgt; = + <I>q</I> : = <I>link</I>(<I>temp</I><SUB>h</SUB><I>ead</I> ); + <I>ifLR</I><SUB>p</SUB><I>tr</I> ;SPMlt; ;SPMgt; <I>nullthen</I> + <I>begintemp</I><SUB>p</SUB><I>tr</I> : = <I>LR</I><SUB>p</SUB><I>tr</I>;<I>r</I> : = <I>q</I>; + <I>repeats</I> : = <I>new</I><SUB>m</SUB><I>ath</I>(0, <I>begin</I><SUB>L</SUB><I>R</I><SUB>t</SUB><I>ype</I>(<I>temp</I><SUB>p</SUB><I>tr</I>));<I>link</I>(<I>s</I>) : = <I>r</I>;<I>r</I> : = <I>s</I>; + <I>temp</I><SUB>p</SUB><I>tr</I> : = <I>link</I>(<I>temp</I><SUB>p</SUB><I>tr</I>); + <I>untiltemp</I><SUB>p</SUB><I>tr</I> = <I>null</I>; + <I>link</I>(<I>temp</I><SUB>h</SUB><I>ead</I> ): = <I>r</I>; + <I>end</I>; + <I>whileq</I> ;SPMlt; ;SPMgt; <I>cur</I><SUB>b</SUB><I>reak</I>(<I>cur</I><SUB>p</SUB>)<I>do</I> + <I>beginifnotis</I><SUB>c</SUB><I>har</I><SUB>n</SUB><I>ode</I>(<I>q</I>)<I>then</I>@ ;SPMlt; <I>AdjusttheLRstackforthe</I>| <I>p</I>...@ ;SPMgt; ; + <I>q</I> : = <I>link</I>(<I>q</I>); + <I>end</I> + + @@ ;SPMlt; <I>AdjusttheLRstackforthe</I>| <I>p</I>...@ ;SPMgt; = + <I>iftype</I>(<I>q</I>) = <I>math</I><SUB>n</SUB><I>odethen</I> + <I>ifend</I><SUB>L</SUB><I>R</I>(<I>q</I>)<I>then</I> + <I>beginifLR</I><SUB>p</SUB><I>tr</I> ;SPMlt; ;SPMgt; <I>nullthenifinfo</I>(<I>LR</I><SUB>p</SUB><I>tr</I>) = <I>subtype</I>(<I>q</I>)<I>thenpop</I><SUB>L</SUB><I>R</I>; + <I>end</I> + <I>elsepush</I><SUB>L</SUB><I>R</I>(<I>q</I>) + + @<I>Weusethefactthat</I>| <I>q</I>| <I>nowpointstothenodewith</I>˙
  438. <BR><I>rightskipglue</I>. + + @ ;SPMlt; <I>InsertLRnodesattheend</I>...@ ;SPMgt; = + <I>ifLR</I><SUB>p</SUB><I>tr</I> ;SPMlt; ;SPMgt; <I>nullthen</I> + <I>begins</I> : = <I>temp</I><SUB>h</SUB><I>ead</I>;<I>r</I> : = <I>link</I>(<I>s</I>); + <I>whiler</I> ;SPMlt; ;SPMgt; <I>qdo</I> + <I>begins</I> : = <I>r</I>;<I>r</I> : = <I>link</I>(<I>s</I>); + <I>end</I>; + <I>r</I> : = <I>LR</I><SUB>p</SUB><I>tr</I>; + <I>whiler</I> ;SPMlt; ;SPMgt; <I>nulldo</I> + <I>begintemp</I><SUB>p</SUB><I>tr</I> : = <I>new</I><SUB>m</SUB><I>ath</I>(0, <I>info</I>(<I>r</I>)); + <I>link</I>(<I>s</I>) : = <I>temp</I><SUB>p</SUB><I>tr</I>;<I>s</I> : = <I>temp</I><SUB>p</SUB><I>tr</I>;<I>r</I> : = <I>link</I>(<I>r</I>); + <I>end</I>; + <I>link</I>(<I>s</I>) : = <I>q</I>; + <I>end</I> + + @@ ;SPMlt; <I>AdjusttheLRstackforthe</I>| <I>h</I>...@ ;SPMgt; = + <I>iftype</I>(<I>p</I>) = <I>math</I><SUB>n</SUB><I>odethen</I> + <I>ifend</I><SUB>L</SUB><I>R</I>(<I>p</I>)<I>then</I> + <I>ifsafe</I><SUB>i</SUB><I>nfo</I>(<I>LR</I><SUB>p</SUB><I>tr</I>) = <I>subtype</I>(<I>p</I>)<I>thenpop</I><SUB>L</SUB><I>R</I> + <I>elsebeginincr</I>(<I>LR</I><SUB>p</SUB><I>roblems</I>); + <I>whilelink</I>(<I>q</I>) ;SPMlt; ;SPMgt; <I>pdoq</I> : = <I>link</I>(<I>q</I>); + <I>link</I>(<I>q</I>) : = <I>link</I>(<I>p</I>);<I>free</I><SUB>n</SUB><I>ode</I>(<I>p</I>, <I>small</I><SUB>n</SUB><I>ode</I><SUB>s</SUB><I>ize</I>);<I>p</I> : = <I>q</I>; + <I>end</I> + <I>elsepush</I><SUB>L</SUB><I>R</I>(<I>p</I>) + + @@ ;SPMlt; <I>CheckforLRanomaliesattheendof</I>| <I>h</I>...@ ;SPMgt; = + <I>ifLR</I><SUB>p</SUB><I>tr</I> ;SPMlt; ;SPMgt; <I>nullthen</I> + <I>beginwhilelink</I>(<I>q</I>) ;SPMlt; ;SPMgt; <I>nulldoq</I> : = <I>link</I>(<I>q</I>); + <I>repeattemp</I><SUB>p</SUB><I>tr</I> : = <I>q</I>;<I>q</I> : = <I>new</I><SUB>m</SUB><I>ath</I>(0, <I>info</I>(<I>LR</I><SUB>p</SUB><I>tr</I>));<I>link</I>(<I>temp</I><SUB>p</SUB><I>tr</I>) : = <I>q</I>; + <I>LR</I><SUB>p</SUB><I>roblems</I> : = <I>LR</I><SUB>p</SUB><I>roblems</I> + 10000;<I>pop</I><SUB>L</SUB><I>R</I>; + <I>untilLR</I><SUB>p</SUB><I>tr</I> = <I>null</I>; + <I>end</I>; + <I>ifLR</I><SUB>p</SUB><I>roblems</I> ;SPMgt; 0<I>then</I> + <I>beginprint</I><SUB>l</SUB><I>n</I>;<I>print</I><SUB>n</SUB><I>l</I> (;SPMquot;<tex2html_image_mark>#tex2html_wrap_inline206#<I>or</I><tex2html_image_mark>#tex2html_wrap_inline207#<I>problem</I>(;SPMquot;);@/ + <I>print</I><SUB>i</SUB><I>nt</I>(<I>LR</I><SUB>p</SUB><I>roblemsdiv</I>10000);<I>print</I>(;SPMquot;<I>missing</I>,;SPMquot;);@/ + <I>print</I><SUB>i</SUB><I>nt</I>(<I>LR</I><SUB>p</SUB><I>roblemsmod</I>10000);<I>print</I>(;SPMquot;<I>extra</I>;SPMquot;);@/ + <I>LR</I><SUB>p</SUB><I>roblems</I> : = 0;<I>gotocommon</I><SUB>e</SUB><I>nding</I>; + <I>end</I> + + @@ ;SPMlt; <I>Declareproceduresneededin</I>| <I>hlist</I><SUB>o</SUB><I>ut</I>|,| <I>vlist</I><SUB>o</SUB><I>ut</I>|@ ;SPMgt; = + <I>procedureLR</I><SUB>c</SUB><I>onfusion</I>; + <I>beginconfusion</I>(;SPMquot;<I>LR</I>;SPMquot;); + @ : <I>thiscan'thappenLR</I><#104#><#105#>;SPMnbsp;;SPMnbsp;;SPMnbsp;;SPMnbsp;LR@;SPMgt;
  439. +end;
  440. +
  441. +@ @d LR_dir(#)==(subtype(#) div 4) <#70#>text direction of a `math node'<#70#>
  442. +
  443. +@;SPMlt;Adjust the LR stack for the |s...@;SPMgt;=
  444. +if end_LR(p) then
  445. +  begin if info(LR_ptr);SPMlt;;SPMgt;subtype(p) then LR_confusion;
  446. +  pop_LR; type(p):=kern_node;
  447. +  end
  448. +else  begin push_LR(p); type(p):=kern_node;
  449. +  if LR_dir(p);SPMlt;;SPMgt;cur_dir then
  450. +    begin @;SPMlt;Reverse an hlist segment containing right-to-left material@;SPMgt;;
  451. +    goto reswitch;
  452. +    end;
  453. +  type(p):=kern_node;
  454. +  end
  455. +
  456. +@ @d edge_node=style_node <#71#>a |style_node| does not occur during |ship_out|<#71#>
  457. +@d edge_node_size=style_node_size <#72#>number of words in an edge node<#72#>
  458. +@d edge_dist(#)==depth(#) <#73#>new |left_edge| position relative to |cur_h|
  459. +   (after |width| has been taken into account)<#73#>
  460. +
  461. +@;SPMlt;Declare procedures needed in |hlist_out|, |vlist_out|@;SPMgt;=
  462. +function new_edge(@!s:small_number;@!w:scaled):pointer;
  463. +  <#74#>create an edge node<#74#>
  464. +var p:pointer; <#75#>the new node<#75#>
  465. +begin p:=get_node(edge_node_size); type(p):=edge_node;
  466. +subtype(p):=s; width(p):=w; <#76#>the |edge_dist| field will be set later<#76#>
  467. +new_edge:=p;
  468. +end;
  469. +
  470. +@ @;SPMlt;Cases of |hlist_out| that arise...@;SPMgt;=
  471. +edge_node: begin cur_h:=cur_h+width(p);
  472. +  left_edge:=cur_h+edge_dist(p); cur_dir:=subtype(p);
  473. +  end;
  474. +
  475. +@ We detach the hlist, start a new one consisting of just one kern node,
  476. +append the reversed list, and set the width of the kern node.
  477. +
  478. +@;SPMlt;Reverse the complete hlist...@;SPMgt;=
  479. +begin save_h:=cur_h; temp_ptr:=p; p:=new_kern(0); link(prev_p):=p;
  480. +cur_h:=0; link(p):=reverse(this_box,null); width(p):=-cur_h;
  481. +cur_h:=save_h; type(this_box):=R_node;
  482. +end
  483. +
  484. +@ We detach the remainder of the hlist, replace the math node by
  485. +an edge node, and append the reversed hlist segment to it; the tail of
  486. +the reversed segment is another edge node and the remainder of the
  487. +original list is attached to it.
  488. +
  489. +@;SPMlt;Reverse an hlist segment...@;SPMgt;=
  490. +begin save_h:=cur_h; temp_ptr:=link(p); rule_wd:=width(p);
  491. +free_node(p,small_node_size);
  492. +cur_dir:=reflected; p:=new_edge(cur_dir,rule_wd); link(prev_p):=p;
  493. +cur_h:=cur_h-left_edge+rule_wd;
  494. +link(p):=reverse(this_box,new_edge(reflected,0));
  495. +edge_dist(p):=cur_h; cur_dir:=reflected; cur_h:=save_h;
  496. +end
  497. +
  498. +@ The |reverse| function defined here is responsible to reverse the
  499. +nodes of an hlist (segment). The first parameter |this_box| is the
  500. +enclosing hlist node, the second parameter |t| is to become the tail of
  501. +the reversed list, and the global variable |temp_ptr| is the head of the
  502. +list to be reversed. We remove nodes from the original list and add them
  503. +to the head of the new one.
  504. +
  505. +@;SPMlt;Declare procedures needed in |hlist_out|, |vlist_out|@;SPMgt;=
  506. +function reverse(@!this_box,@!t:pointer):pointer;
  507. +label reswitch, next_p, done;
  508. +var l:pointer; <#77#>the new list<#77#>
  509. +@!p:pointer; <#78#>the current node<#78#>
  510. +@!q:pointer; <#79#>the next node<#79#>
  511. +@!g_order: glue_ord; <#80#>applicable order of infinity for glue<#80#>
  512. +@!g_sign: normal..shrinking; <#81#>selects type of glue<#81#>
  513. +@!m,@!n:halfword; <#82#>number of unmatched math nodes<#82#>
  514. +begin g_order:=glue_order(this_box); g_sign:=glue_sign(this_box);
  515. +l:=t; p:=temp_ptr; m:=min_halfword; n:=min_halfword;
  516. +while p;SPMlt;;SPMgt;null do @;SPMlt;Move node |p| to the new list and go to the next node;
  517. +  or |goto done| if the end of the reflected segment has been reached@;SPMgt;;
  518. +if (t;SPMlt;;SPMgt;null)or(m;SPMlt;;SPMgt;min_halfword)or(n;SPMlt;;SPMgt;min_halfword) then LR_confusion;
  519. +done:reverse:=l;
  520. +end;
  521. +
  522. +@ @;SPMlt;Move node |p| to the new list...@;SPMgt;=
  523. +reswitch: if is_char_node(p) then
  524. +  repeat f:=font(p); c:=character(p);
  525. +  cur_h:=cur_h+char_width(f)(char_info(f)(c));
  526. +  q:=link(p); link(p):=l; l:=p; p:=q;
  527. +  until not is_char_node(p)
  528. +else @;SPMlt;Move the non-|char_node| |p| to the new list@;SPMgt;
  529. +
  530. +@ @;SPMlt;Move the non-|char_node| |p| to the new list@;SPMgt;=
  531. +begin q:=link(p); rule_wd:=width(p); <#83#>the width is needed in most cases<#83#>
  532. +case type(p) of
  533. +hlist_node,vlist_node,rule_node,kern_node: do_nothing;
  534. +@t@;SPMgt;@;SPMlt;Cases of |reverse| that need special treatment@;SPMgt;@;
  535. +R_node,edge_node: LR_confusion;
  536. +othercases goto next_p
  537. +endcases;@/
  538. +cur_h:=cur_h+rule_wd;
  539. +next_p: if (type(p)=kern_node)and((rule_wd=0)or(l=null)) then
  540. +  free_node(p,small_node_size)
  541. +else  begin link(p):=l; l:=p;
  542. +  end;
  543. +p:=q;
  544. +end
  545. +
  546. +@ In order to avoid the unnecessary repetition of computations we try to
  547. +replace glue nodes by equivalent kern or rule nodes.
  548. +
  549. +@;SPMlt;Cases of |reverse|...@;SPMgt;=
  550. +glue_node: begin g:=glue_ptr(p); rule_wd:=width(g);
  551. +if g_sign;SPMlt;;SPMgt;normal then
  552. +  begin if g_sign=stretching then
  553. +    begin if stretch_order(g)=g_order then
  554. +      rule_wd:=rule_wd+round(float(glue_set(this_box))*stretch(g));
  555. +@^real multiplication@;SPMgt;
  556. +    end
  557. +  else  begin if shrink_order(g)=g_order then
  558. +      rule_wd:=rule_wd-round(float(glue_set(this_box))*shrink(g));
  559. +    end;
  560. +  end;
  561. +temp_ptr:=leader_ptr(p);
  562. +if temp_ptr=null then
  563. +  begin delete_glue_ref(g); type(p):=kern_node; width(p):=rule_wd;
  564. +  end
  565. +else if type(temp_ptr)=rule_node then
  566. +  begin delete_glue_ref(g); free_node(p,small_node_size);
  567. +  p:=temp_ptr; width(p):=rule_wd;
  568. +  end;
  569. +end;
  570. +
  571. +@ A ligature node is replaced by a char node.
  572. +
  573. +@;SPMlt;Cases of |reverse|...@;SPMgt;=
  574. +ligature_node: begin flush_node_list(lig_ptr(p));
  575. +temp_ptr:=p; p:=get_avail; mem[p]:=mem[lig_char(temp_ptr)]; link(p):=q;
  576. +free_node(temp_ptr,small_node_size); goto reswitch;
  577. +end;
  578. +
  579. +@ Math nodes in an inner reflected segment are modified, those at the
  580. +outer level are changed into kern nodes.
  581. +
  582. +@;SPMlt;Cases of |reverse|...@;SPMgt;=
  583. +math_node: if end_LR(p) then
  584. + if n;SPMgt;min_halfword then
  585. +  begin decr(n); decr(subtype(p)); <#84#>change |after| into |before|<#84#>
  586. +  end
  587. + else begin if info(LR_ptr);SPMlt;;SPMgt;subtype(p) then LR_confusion;
  588. +  pop_LR;
  589. +  if m=min_halfword then @;SPMlt;Finish the reversed list and |goto done|@;SPMgt;;
  590. +  decr(m); type(p):=kern_node;
  591. +  end
  592. +else if (n;SPMgt;min_halfword)or(LR_dir(p);SPMlt;;SPMgt;cur_dir) then
  593. +  begin incr(n); incr(subtype(p)); <#85#>change |before| into |after|<#85#>
  594. +  end
  595. + else begin push_LR(p); incr(m); type(p):=kern_node;
  596. +  end;
  597. +
  598. +@ Finally we have found the end of the hlist segment to be reversed; the
  599. +terminating math node is released and the remaining list is attached to
  600. +the edge node at the end of the reversed list.
  601. +
  602. +@;SPMlt;Finish the reversed list and |goto done|@;SPMgt;=
  603. +begin if t=null then LR_confusion; free_node(p,small_node_size);
  604. +link(t):=q; width(t):=rule_wd; edge_dist(t):=-cur_h-rule_wd;
  605. +goto done;
  606. +end
  607.  
  608. <P>
  609. -- 
  610. Dr. Zvi Har'El ;SPMlt;rl@math.technion.ac.il;SPMgt;                Department of Mathematics
  611. +972-4-294094(Phone)                   Technion - Israel Institute of Technology
  612. +972-4-324654(FAX)                                           Haifa 32000, ISRAEL
  613.